import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.UUID;

public class JWT令牌测试 {

    public static void main(String[] args) {
        //创建令牌
        JwtBuilder JWT = Jwts.builder()
                .setId(UUID.randomUUID().toString()) //令牌ID,最好是唯一,可以使用UUID
                .setSubject("zhangsan")  // 设置 令牌主题 , 可以是Json数据
                .setIssuedAt(new Date())  //设置令牌的签发日期
                .claim("name", "zhangsan")   //自定义数据, 放在令牌中 , 避免放入重要数据,可以被Bate64 解析
                .claim("age", 33) // 可以放入多个数据
                .setExpiration(null)   //令牌过期时间 : 不设置为永久, 可以接收一个DATA数据,
                .signWith(SignatureAlgorithm.HS256, "itheima");//设置签名 : 使用 HS256算法给第二个参数(itheima)进行加密

        //获取令牌编码
        String compact = JWT.compact();
        System.out.println("令牌 : " +compact);



        //解析令牌编码
        //Jwts.parser() : 解析令牌编码
        //setSigningKey : 设置 令牌编码时设置的 签名;
        //.parseClaimsJws: 设置 要解析的 令牌 ,
        //getBody : 获取 令牌中 被Bast64 编码 后 又被解析的数据 ;
        Claims claims = Jwts.parser().setSigningKey("itheima").parseClaimsJws(compact).getBody();//令牌 : eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5Yzg3YWFjNC1kZDg1LTRkNTctYTlkOC1hZTEwMTRlMDMwN2EiLCJzdWIiOiJ6aGFuZ3NhbiIsImlhdCI6MTU4MjE5NjAzMiwibmFtZSI6InpoYW5nc2FuIiwiYWdlIjozM30.tasQd-rwptqsIHZy4E1UtH5By05v11JasZGnUtzppO0
        System.out.println("令牌解析 : " + claims); //令牌解析 : {jti=9c87aac4-dd85-4d57-a9d8-ae1014e0307a, sub=zhangsan, iat=1582196032, name=zhangsan, age=33}
        //如果 令牌解析中 出现异常 , 则为 令牌非法 或者 令牌过期 ;

    }

}
